package org.TCC_NOVO.client.visual;

import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.DeferredCommand;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.gwtext.client.core.EventObject;
import com.gwtext.client.core.Ext;
import com.gwtext.client.core.Function;
import com.gwtext.client.data.FieldDef;
import com.gwtext.client.data.IntegerFieldDef;
import com.gwtext.client.data.Record;
import com.gwtext.client.data.RecordDef;
import com.gwtext.client.data.Store;
import com.gwtext.client.data.StringFieldDef;
import com.gwtext.client.util.Format;
import com.gwtext.client.widgets.Button;
import com.gwtext.client.widgets.MessageBox;
import com.gwtext.client.widgets.Panel;
import com.gwtext.client.widgets.Tool;
import com.gwtext.client.widgets.Toolbar;
import com.gwtext.client.widgets.ToolbarButton;
import com.gwtext.client.widgets.Window;
import com.gwtext.client.widgets.event.ButtonListenerAdapter;
import com.gwtext.client.widgets.grid.CellMetadata;
import com.gwtext.client.widgets.grid.ColumnConfig;
import com.gwtext.client.widgets.grid.ColumnModel;
import com.gwtext.client.widgets.grid.GridPanel;
import com.gwtext.client.widgets.grid.Renderer;
import com.gwtext.client.widgets.grid.event.GridCellListenerAdapter;
import java.util.ArrayList;
import org.TCC_NOVO.client.GWTServiceAsync;
import org.TCC_NOVO.client.modelo.Roteiro;
import org.TCC_NOVO.client.modelo.Unidade;
import org.TCC_NOVO.client.modelo.Usuario;

public class MatrizPanelWindow extends Window {

    private final GWTServiceAsync controller;
    public int IDF_Proj;
    public int IDF_Usuario;
    public int UltNumero = 0;
    RecordDef recordDef;
    Store store;
    GridPanel grid;
    Toolbar toolbar;
    MatrizForm matForm;
    MatrizPanelWindow self;
    RoteirosForm roteiroForm;

    //ArrayList<TipoAvaliacao> arrayTipoAval = new ArrayList();
    ArrayList<Unidade> arrayUnidades = new ArrayList();
    ArrayList<Usuario> ArrayUsua = new ArrayList();

    public MatrizPanelWindow(GWTServiceAsync controller, int IDProj, int IDF_Usua) {
        this.controller = controller;
        this.IDF_Usuario = IDF_Usua;
        this.IDF_Proj = IDProj;
        this.self = this;
        this.setTitle("Matriz de Design Instrucional");
        this.init();
        this.setModal(true);
    }

    private void init() {

        Panel panel = new Panel();
        panel.setBorder(true);
        panel.setPaddings(2);

        //controller.RetornarDadosTipoAvaliacao("select * from Tipo_Avaliacao ", new CallBackRetTipoDesc());
        String sSQL = "select * from Usuario A "+
                "inner join Papeis B on B.ID = A.IDF_Papel "+
                "where (B.Papel = 'Programador') or (B.Papel = 'Designer')";
        controller.RetornarDadosUsuarioTarefas(sSQL, new CallBackRetUsuarios());

        recordDef = new RecordDef(new FieldDef[]{
                    new IntegerFieldDef("ID"),
                    new IntegerFieldDef("numero"),
                    new StringFieldDef("nome"),
                    new StringFieldDef("status"),
                    new StringFieldDef("descricao"),
                    new IntegerFieldDef("duracao"),});

        store = new Store(recordDef);

        grid = new GridPanel();
        grid.setStore(store);

        ColumnConfig configClique = new ColumnConfig("Roteiro Unidade","idcoluna");
        Renderer btCliqueRenderer = new Renderer() {
            @Override
            public String render(Object value, CellMetadata cellMetadata, final Record record, int rowIndex, int colNum, Store stores) {
                final Button btn = new Button("Roteiro", new ButtonListenerAdapter() {
                    @Override
                    public void onClick(Button button, EventObject e) {
                        grid.getSelectionModel().selectRow(Integer.parseInt(button.getTitle()));
                        if (grid.getSelectionModel().getSelected() == null) {
                            MessageBox.alert("Necessário Selecionar Algum Registro! ");
                        } else {
                            roteiroForm = new RoteirosForm(self, controller, IDF_Usuario, grid.getSelectionModel().getSelected().getAsInteger("ID"));
                            roteiroForm.show();
                        }
                        grid.getSelectionModel().deselectRow(Integer.parseInt(button.getTitle()));
                    }
                });
                final String id = Ext.generateId();
                btn.setRenderToID(id);
                btn.setTitle(Integer.toString(rowIndex));
                btn.setIcon("Images/roteiro.png");
                DeferredCommand.addCommand(new Command() {
                    @Override
                    public void execute() {
                        if (DOM.getElementById(id) != null)
                            btn.render(id);
                    }
                });
                return Format.format("<div id='{0}' class='fixGridButton' style='padding:0px;width:100%;height:100%;'></div>", id);
            }
        };
        configClique.setRenderer(btCliqueRenderer);
        //grid.setColumnModel(new ColumnModel(new ColumnConfig[] {configClique }));

        ColumnConfig[] columns = new ColumnConfig[]{
            new ColumnConfig("", "numero", 60, true),
            new ColumnConfig("Nome", "nome", 170, true),
            new ColumnConfig("Status", "status", 140, true),
            new ColumnConfig("Descrição", "descricao", 280, true),
            new ColumnConfig("Duração (minutos)", "duracao", 100, true),
            configClique,
        };

        ColumnModel columnModel = new ColumnModel(columns);
        grid.setColumnModel(columnModel);
        grid.setFrame(true);
        grid.setStripeRows(true);
        grid.setSize(1020, 600);
        grid.setTitle("Unidades de Aprendizagem");
        grid.addTool(new Tool(Tool.REFRESH, new Function() {
            @Override
            public void execute() {
                grid.getEl().mask("Carregando", "x-mask-loading");
                CarregarGrid();
                Timer timer = new Timer() {
                    @Override
                    public void run() {
                        grid.getEl().unmask();
                    }
                };
                timer.schedule(1000);
            }
        }, "Atualizar"));

        grid.addGridCellListener(new GridCellListenerAdapter() {
            public void onCellDblClick(GridPanel grid, int rowIndex, int colIndex, EventObject e) {
                matForm.limparUnidadeGeral();
                matForm.ID_Form = grid.getSelectionModel().getSelected().getId();
                matForm.show(true);
                for (int i = 0; i < arrayUnidades.size(); ++i) {
                    if (Integer.toString(arrayUnidades.get(i).getId()).equals(matForm.ID_Form)) {
                        matForm.loadRecord(arrayUnidades.get(i));
                    }
                }
            }
        });

        toolbar = getToolbar();
        grid.setTopToolbar(toolbar);

        panel.add(grid);
        this.add(panel);

        CarregarGrid();
    }

    public void CarregarGrid(){
        store.removeAll();
        String sSQL = "select * from unidade where IDF_Projeto = " + IDF_Proj;
        controller.RetornarDadosMatriz(sSQL, new CallBackRetMatriz());
    }

    private class CallBackRetMatriz implements AsyncCallback<ArrayList<Unidade>> {
        public void onFailure(Throwable e) {
            MessageBox.alert("Erro ao carregar dados... ", e.getMessage());
        }
        public void onSuccess(ArrayList<Unidade> result) {
            arrayUnidades = result;
            CarregarDados(result);
            matForm = new MatrizForm(self, controller);
        }
    }

    private class CallBackRetUsuarios implements AsyncCallback<ArrayList<Usuario>> {
	public void onFailure(Throwable e) {
            MessageBox.alert("Erro ao carregar dados... ", e.getMessage());
	}
	public void onSuccess(ArrayList<Usuario> result) {
            ArrayUsua = result;
        }
    }

    private void CarregarDados(ArrayList<Unidade> result) {
        for (int i = 0; i < result.size(); ++i) {
            addRecord(result.get(i), i+1);
            UltNumero = i+i;
        }        
    }

    public void addRecord(Unidade unid, int num) {
        Object[] rowData = new Object[]{
            unid.getId(),
            num,
            unid.getNome(),
            unid.getStatus(),
            unid.getDescricao(),
            unid.getDuracao(),};
        Record record = recordDef.createRecord(rowData[0].toString(), rowData);
        store.add(record);
    }

    private void removeUnidade() {
        store.remove(grid.getSelectionModel().getSelected());
    }

    public Toolbar getToolbar() {

        final AsyncCallback callbackExcluirReg = new AsyncCallback() {

            public void onSuccess(Object result) {
                //MessageBox.alert("Registro Gravado com Sucesso!");
            }

            public void onFailure(Throwable caught) {
                MessageBox.alert("Erro ", caught.getMessage());
            }
        };

        ToolbarButton btnNovo = new ToolbarButton();
        btnNovo.setText(" Incluir");
        btnNovo.setIcon("Images/filenew.png");
        btnNovo.setTooltip("Incluir um novo registro");
        btnNovo.addListener(new ButtonListenerAdapter() {

            public void onClick(Button button, EventObject e) {
                matForm.show(false);
                //Object[] rowData = new Object[]{"","","","","",""};
                //Record record = recordDef.createRecord(rowData[0].toString(), rowData);
                //matForm.loadRecord(record);
            }
        });

        ToolbarButton btnEdit = new ToolbarButton();
        btnEdit.setText(" Editar");
        btnEdit.setIcon("Images/edit.png");
        btnEdit.setTooltip("Edita o registro selecionado");
        btnEdit.addListener(new ButtonListenerAdapter() {

            public void onClick(Button button, EventObject e) {
                if (grid.getSelectionModel().getSelected() == null) {
                    MessageBox.alert("Necessário Selecionar Algum Registro! ");
                } else {
                    matForm.limparUnidadeGeral();
                    matForm.ID_Form = grid.getSelectionModel().getSelected().getId();
                    matForm.show(true);
                    for (int i = 0; i < arrayUnidades.size(); ++i) {
                        if (Integer.toString(arrayUnidades.get(i).getId()).equals(matForm.ID_Form)) {
                            matForm.loadRecord(arrayUnidades.get(i));
                        }
                    }
                }
            }
        });

        ToolbarButton btnRemove = new ToolbarButton();
        btnRemove.setText(" Remover");
        btnRemove.setIcon("Images/remove.png");
        btnRemove.setTooltip("Remove o registro selecionado");
        btnRemove.addListener(new ButtonListenerAdapter() {

            public void onClick(Button button, EventObject e) {
                if (grid.getSelectionModel().getSelected() == null) {
                    MessageBox.alert("Necessário Selecionar Algum Registro! ");
                } else {
                    MessageBox.confirm("Confirmação de Exclusão", "Deseja Realmente Excluir o Registro?", new MessageBox.ConfirmCallback() {

                        public void execute(String btnID) {
                            if (btnID.equals("yes")) {
                                for (int i = 0; i < arrayUnidades.size(); ++i) {
                                    if (Integer.toString(arrayUnidades.get(i).getId()).equals(grid.getSelectionModel().getSelected().getId())) {
                                        controller.ExcluirDadosUnidade(arrayUnidades.get(i), callbackExcluirReg);
                                        removeUnidade();
                                        arrayUnidades.remove(i);
                                    }
                                }
                            }
                        }
                    });
                }
            }
        });

        /*ToolbarButton btnRoteiro = new ToolbarButton();
        btnRoteiro.setText(" Roteiro");
        btnRoteiro.setIcon("Images/roteiro.png");
        btnRoteiro.setTooltip("Abre cadastro de roteiro");
        btnRoteiro.addListener(new ButtonListenerAdapter() {
        public void onClick(Button button, EventObject e) {
            if (grid.getSelectionModel().getSelected() == null) {
                MessageBox.alert("Necessário Selecionar Algum Registro! ");
            } else {
                RoteiroForm.limparRoteiroGeral();
                RoteiroForm.IDF_unidade = grid.getSelectionModel().getSelected().getAsInteger("ID");
                RoteiroForm.show(false);
                for (int i = 0; i < ArrayRoteiro.size(); ++i) {
                    if (ArrayRoteiro.get(i).getIDF_Unidade() == RoteiroForm.IDF_unidade) {
                        RoteiroForm.ID_Form = Integer.toString(ArrayRoteiro.get(i).getID());
                        RoteiroForm.loadRecord(ArrayRoteiro.get(i));
                    }
                }
            }
        }
        });*/

        Toolbar toobar = new Toolbar();
        toobar.addButton(btnNovo);
        toobar.addButton(btnEdit);
        toobar.addButton(btnRemove);
        toobar.addSeparator();
        //toobar.addButton(btnRoteiro);

        return toobar;
    }
}
